home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 46 / Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso / -in_the_mag- / reader_requests / amiga-e / modules / mui / muicustomclass.e next >
Text File  |  1999-09-13  |  2KB  |  70 lines

  1. /*****************************************************
  2. ** Easy use of MUI-custom-classes in E.
  3. ** Written by Jan Hendrik Schulz
  4. **
  5. ** Usage: Simply use eMui_CreateCustomClass() instead of
  6. **        the original Mui_CreateCustomClass()-function.
  7. **        Your dispatcher-function should look like this:
  8. **
  9. **        PROC myDispatcher(cl:PTR TO iclass,obj,msg:PTR TO msg)
  10. **            DEF methodID
  11. **
  12. **            methodID:=msg.methodid
  13. **            SELECT methodID
  14. **                CASE ...
  15. **                ...
  16. **            ENDSELECT
  17. **
  18. **            RETURN doSuperMethodA(cl,obj,msg)
  19. **        ENDPROC
  20. ******************************************************/
  21.  
  22. OPT MODULE
  23.  
  24. MODULE 'muimaster', 'libraries/mui', 'intuition/classes'
  25.  
  26. OBJECT data
  27.   user:LONG         -> for userdata (use iclass.userdata[] instead of iclass.userdata)
  28.   dispfunc:LONG     -> holds the address of the dispatcher-function
  29.   storea4:LONG      -> A4 is stored here
  30. ENDOBJECT
  31.  
  32. EXPORT PROC eMui_CreateCustomClass(base,supername,supermcc,datasize,dispfunc) HANDLE
  33.   DEF mem:PTR TO data, 
  34.       mcc:PTR TO mui_customclass
  35.   
  36.   NEW mem                     -> get some memory
  37.   
  38.   IF (mcc:=Mui_CreateCustomClass(base,supername,supermcc,datasize,{dispentry}))=NIL
  39.     END mem
  40.     RETURN NIL
  41.   ENDIF
  42.   
  43.   MOVE.L mem,A0               -> ptr to data to A0
  44.   MOVE.L mcc,A1               -> ptr to mui_customclass to A1
  45.   MOVE.L 24(A1),A1            -> ptr to iclass to A1
  46.   MOVE.L A0,36(A1)            -> store ptr to data in iclass.userdata
  47.   MOVE.L A4,8(A0)             -> store A4 in data.storea4
  48.   MOVE.L dispfunc,4(A0)       -> store address of dispfunc in data.dispfunc
  49.   
  50. EXCEPT
  51.   RETURN NIL
  52. ENDPROC mcc
  53.  
  54. dispentry:
  55.   MOVEM.L D2-D7/A2-A6,-(A7)   -> save registers to stack
  56.   
  57.   MOVE.L  A0,-(A7)            -> PTR TO iclass as PROC-arg to stack
  58.   MOVE.L  A2,-(A7)            -> the object as PROC-arg
  59.   MOVE.L  A1,-(A7)            -> the message as PROC-arg
  60.   
  61.   MOVE.L  36(A0),A1           -> iclass.userdate to A1
  62.   MOVE.L  8(A1),A4            -> data.storea4 to A4
  63.   MOVE.L  4(A1),A0            -> data.dispfunc to A0
  64.   JSR     (A0)                -> jump to dispfunc
  65.   
  66.   LEA     12(A7),A7           -> reset stack
  67.   MOVEM.L (A7)+,D2-D7/A2-A6   -> restore registers
  68.   RTS                         -> return to caller
  69.  
  70.